﻿using System;
using System.Collections.Generic;
using ChainAnalises.Classes.AuxiliaryClasses.WebServices.SOAP;
using ChainAnalises.Classes.IntervalAnalysis;
using ChainAnalises.Classes.Root.SimpleTypes;
using CharacteristicCalculator.Model;

namespace CharacteristicCalculator.Controller
{
    /// <summary>
    /// Класс-контроллер кластеризации
    /// </summary>
    public class CalculatorController
    {
        /// <summary>
        /// Метод обрабатывающий данные для кластеризации
        /// </summary>
        /// <param name="Data">Контейнер с исходными данными</param>
        /// <returns>Контейнер с результатами кластеризации</returns>
        public ResultContainer Divide(DataContainer Data)
        {
            DateTime overallBegin = DateTime.Now;
            //различные представления цепочек
            List<Chain> NucleotideChains = new List<Chain>();
            List<Chain> AminoChains = new List<Chain>();
            List<UniformChain> AChain = new List<UniformChain>();
            List<UniformChain> CChain = new List<UniformChain>();
            List<UniformChain> GChain = new List<UniformChain>();
            List<UniformChain> TChain = new List<UniformChain>();
            //массив всех представлений цепочек
            List<List<ChainWithCharacteristic>> Chains = new List<List<ChainWithCharacteristic>>();
            //массив индексов цепочек
            List<int> Numbers = new List<int>();
            //заполнение массива Chains (проверки на то в каком виде представлять цепочки)
            for (int i = 0; i < Data.DNAs.Count; i++)
            {
                //перекодировка цепочек в вид классов либиады
                NucleotideChains.Add(ChainGetters.GetNucleotideChain(Data.DNAs[i].DNA));
                Numbers.Add(Data.DNAs[i].Number);
                Chains.Add(new List<ChainWithCharacteristic>());
                //если необходимо представление в виде аминокислот
                if (Data.AminoChains)
                {
                    AminoChains.Add(ChainGetters.GetAminoChain(NucleotideChains[i]));
                    Chains[i].Add(AminoChains[i]);
                }
                //если необходимо представление в виде однородных цепочек
                if (Data.SimpleNucleotideChains)
                {
                    AChain.Add(ChainGetters.GetSimpleNucleotideChain(NucleotideChains[i], new ValueChar('A')));
                    Chains[i].Add(AChain[i]);
                    CChain.Add(ChainGetters.GetSimpleNucleotideChain(NucleotideChains[i], new ValueChar('C')));
                    Chains[i].Add(CChain[i]);
                    GChain.Add(ChainGetters.GetSimpleNucleotideChain(NucleotideChains[i], new ValueChar('G')));
                    Chains[i].Add(GChain[i]);
                    TChain.Add(ChainGetters.GetSimpleNucleotideChain(NucleotideChains[i], new ValueChar('T')));
                    Chains[i].Add(TChain[i]);
                }
                //если необходимо нуклеотидное представление
                if (Data.NucleotideChains)
                {
                    Chains[i].Add(NucleotideChains[i]);
                }
            }
           
            SoapDataTable table = DataTableFiller.FillDataTable(Chains, Numbers, Data.Caracteristics, Data.link, Data.Normalize);
            
            ResultContainer Result = new ResultContainer();
            Result.dataTable = table;
          
            return Result;
        }
    }
}